package com.iot.springbootminio.utils;

import io.minio.GetPresignedObjectUrlArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.http.Method;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Objects;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MinioUtil {

    @Autowired
    private MinioClient minioClient;

    /**
     * 文件上传
     *
     * @param file       文件
     * @param dirName    存储服务器上的存放目录
     * @param objectName 存储服务器上的文件名称（唯一）
     * @return 是否上传成功
     */
    public Boolean putObject(File file, String dirName, String objectName) {
        try {
            return this.putObject(new FileInputStream(file), dirName, objectName,
                    "application/octet-stream");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 文件上传
     *
     * @param inputStream 文件输入流
     * @param dirName     存储服务器上的存放目录
     * @param objectName  存储服务器上的文件名称（唯一）
     * @param contentType 内容类型
     * @return 是否上传成功
     */
    public Boolean putObject(FileInputStream inputStream, String dirName, String objectName,
            String contentType) {

        try {
            String path = objectName;
            if (!Objects.isNull(dirName)) {
                path = dirName + "/" + objectName;
            }

            PutObjectArgs objectArgs = PutObjectArgs.builder().bucket("iotp-irsb-bucket-prod")
                    .contentType(contentType).object(path)
                    .stream(inputStream, inputStream.getChannel().size(), -1).build();

            // 文件名称相同会覆盖
            minioClient.putObject(objectArgs);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return true;
    }

    /**
     * 获取文件外链
     *
     * @param dirName    存储服务器上的存放目录
     * @param objectName 存储服务器上的文件名称（唯一）
     * @return 文件外链
     */
    public String getObjectUrl(String dirName, String objectName) {

        String path = objectName;
        if (!Objects.isNull(dirName)) {
            path = dirName + "/" + objectName;
        }

        GetPresignedObjectUrlArgs objectUrlArgs = GetPresignedObjectUrlArgs.builder()
                .bucket("iotp-irsb-bucket-prod")
                .object(path).method(Method.GET).build();

        try {
            return minioClient.getPresignedObjectUrl(objectUrlArgs);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
}
